4.2 Виджеты. Buttons GestureDetector
4 из 4 шагов пройдено

 Виджеты. Buttons GestureDetector

➡️Ссылка на репозиторий с кодом этого урока

Обработка жестов

Обработка жестов во Flutter позволяет приложениям реагировать на различные действия пользователя, такие как нажатия, удержания, перетаскивания и масштабирование. Для реализации этой функциональности используются виджеты, способные обнаруживать и обрабатывать жесты. Основными из них являются GestureDetector и InkWell

GestureDetector

Это невидимый виджет, который перехватывает события жестов и позволяет выполнять определённые действия в ответ на них.

onTap: Одиночное нажатие.
onDoubleTap: Двойное нажатие.
onLongPress: Длительное нажатие.
onTapDown: Нажатие вниз.
onTapUp: Отпускание после нажатия.
onTapCancel: Отмена нажатия.
onPanStart: Начало перемещения.
onPanUpdate: Обновление позиции при перемещении.
onPanEnd: Завершение перемещения.
onScaleStart: Начало масштабирования.
onScaleUpdate: Обновление при масштабировании.
onScaleEnd: Завершение масштабирования.

class GestureDetectorExample extends StatefulWidget {  
  @override  
  State<GestureDetectorExample> createState() => _GestureDetectorExampleState(); 
}  
  
class _GestureDetectorExampleState extends State<GestureDetectorExample> {  
  String message = "Тыкай по картинке";  
  
  _changeMessage(String newMessage) {  
    setState(() {  
      message = newMessage;  
    });  
  }  
  
  @override  
  Widget build(BuildContext context) {  
    return Column(  
      mainAxisAlignment: MainAxisAlignment.center,  
      children: [  
        Text(message, style: TextStyle(fontSize: 18)),  
        SizedBox(height: 20),  
        
        GestureDetector(  
          onTap: () => _changeMessage("onTap: Нажатие на объект"),  
          onDoubleTap: () => _changeMessage("onDoubleTap: Двойное нажатие"),  
          onLongPress: () => _changeMessage("onLongPress: Долгое нажатие"),  
          onPanUpdate: (details) => _changeMessage("${details.delta}"),  
  
          child: CircleAvatar(  
            backgroundImage: AssetImage("assets/images/pro.webp"),  
            radius: 150,  
          ),  
        ),  
      ],  
    );  
  }  
}

InkWell

Это виджет из библиотеки Material, который реагирует на нажатия, показывая эффект "чернильного всплеска" (ripple effect). Он часто используется для создания интерактивных элементов с визуальной обратной связью

Для корректной работы InkWell необходимо, чтобы он находился внутри виджета, предоставляющего эффект "чернильного всплеска". Обычно это Material.

class InkWellExample extends StatelessWidget {  
  @override  
  Widget build(BuildContext context) {  
    return Center(  
      child: Material(  
        borderRadius: BorderRadius.circular(12),  
        child: InkWell(  
          borderRadius: BorderRadius.circular(12),  
          splashColor: Colors.green[300],  
          onTap: () {},  
          child: SizedBox(  
            width: 200,  
            height: 200,  
            child: Center(child: Text('InkWell')),  
          ),  
        ),  
      ),  
    );  
  }  
}

Параметры виджета InkWell

onHighlightChanged: Вызывается при изменении состояния подсветки кнопки.
onHover: Обработчик события наведения курсора (для десктопа и веба).
mouseCursor: Курсор мыши при наведении
focusColor: Цвет при фокусировке на виджете.
hoverColor: Цвет при наведении курсора.

highlightColor: Цвет выделения при нажатии.
overlayColor: Цвет эффекта поверх виджета при взаимодействии.
splashColor: Цвет "чернильного всплеска" при нажатии.
splashFactory: Фабрика, создающая эффект "всплеска"

radius: Радиус области "всплеска" при нажатии.
borderRadius: Радиус закругления границ "всплеска".
customBorder: Форма области "всплеска" (например, StadiumBorder()).
enableFeedback: использовать ли звуковую и тактильную обратную связь.

focusNode: Узел фокуса для работы с клавиатурой.
canRequestFocus: Может ли InkWell получать фокус клавиатуры.
onFocusChange: Вызывается при изменении состояния фокуса.
autofocus: Должен ли виджет автоматически получать фокус.
statesController: Контроллер для управления состояниями
hoverDuration: Длительность анимации наведения курсора


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий